package JavaCode.random_records.N801_900;

import java.util.ArrayList;
import java.util.List;

public class N842_split_array_into_fibonacci_sequence {

    public List<Integer> splitIntoFibonacci(String S) {
        List<Integer> res=new ArrayList<>();
        dfs(0,res,S);
        return res;
    }

    private boolean dfs(int idx, List<Integer> res,String s) {
        if(idx==s.length())
        {
            if(res.size()>2)return true;
            return false;
        }
        if(s.charAt(idx)=='0')
        {
            if(res.size()<2||res.get(res.size()-1)+res.get(res.size()-2)==0)
            {
                res.add(0);
                if(dfs(idx+1,res,s))return true;
                res.remove(res.size()-1);
            }
            return false;
        }
        int target=-1;
        if(res.size()>=2)
        {
            target=res.get(res.size()-1)+res.get(res.size()-2);
        }
        for (int i=idx+1;i<=s.length();i++)
        {
            int num=0;
            try {
                num=Integer.parseInt(s.substring(idx,i));
            }catch (Exception e)
            {
                return false;
            }
            if(target==-1||num==target)
            {
                res.add(num);
                if(dfs(i,res,s))return true;
                res.remove(res.size()-1);
            }
        }
        return false;
    }
}
/**
 * 给定一个数字字符串 S，比如 S = "123456579"，我们可以将它分成斐波那契式的序列 [123, 456, 579]。
 *
 * 形式上，斐波那契式序列是一个非负整数列表 F，且满足：
 *
 * 0 <= F[i] <= 2^31 - 1，（也就是说，每个整数都符合 32 位有符号整数类型）；
 * F.length >= 3；
 * 对于所有的0 <= i < F.length - 2，都有 F[i] + F[i+1] = F[i+2] 成立。
 * 另外，请注意，将字符串拆分成小块时，每个块的数字一定不要以零开头，除非这个块是数字 0 本身。
 *
 * 返回从 S 拆分出来的所有斐波那契式的序列块，如果不能拆分则返回 []。
 *
 * 示例 1：
 *
 * 输入："123456579"
 * 输出：[123,456,579]
 * 示例 2：
 *
 * 输入: "11235813"
 * 输出: [1,1,2,3,5,8,13]
 * 示例 3：
 *
 * 输入: "112358130"
 * 输出: []
 * 解释: 这项任务无法完成。
 * 示例 4：
 *
 * 输入："0123"
 * 输出：[]
 * 解释：每个块的数字不能以零开头，因此 "01"，"2"，"3" 不是有效答案。
 * 示例 5：
 *
 * 输入: "1101111"
 * 输出: [110, 1, 111]
 * 解释: 输出 [11,0,11,11] 也同样被接受。
 * 提示：
 *
 * 1 <= S.length <= 200
 * 字符串 S 中只含有数字。
 *
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
